home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 2007 December / PCWKCD1207B.iso / Blogowanie poza sfera / Flock 0.9.1.3 stable / flock-0.9.1.3.en-US.win32.exe / flock / components / flockRemoteConsoleLogger.js < prev    next >
Text File  |  2007-10-12  |  7KB  |  265 lines

  1. // vim: tabstop=2 softtabstop=2 shiftwidth=2 expandtab
  2. //
  3. // BEGIN FLOCK GPL
  4. // 
  5. // Copyright Flock Inc. 2005-2007
  6. // http://flock.com
  7. // 
  8. // This file may be used under the terms of of the
  9. // GNU General Public License Version 2 or later (the "GPL"),
  10. // http://www.gnu.org/licenses/gpl.html
  11. // 
  12. // Software distributed under the License is distributed on an "AS IS" basis,
  13. // WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
  14. // for the specific language governing rights and limitations under the
  15. // License.
  16. // 
  17. // END FLOCK GPL
  18. //
  19.  
  20. const CL_CONTRACTID = '@flock.com/remote-console-logger;1';
  21. const CL_CLASSID    = Components.ID('{70dc2acf-7e36-4a43-8f28-3e5f70613428}');
  22. const CL_CLASSNAME  = 'Flock Remote Console Logger';
  23.  
  24.  
  25. const ENABLED_BY_DEFAULT        = false;
  26.  
  27. const LOGGING_URL               = 'http://exceptions.flock.com/log';
  28.  
  29. const PREF_FLOCK_LOG_ERRORS     = 'flock.remote_logging';
  30. const PREF_FLOCK_FIRST_RUN_DATE = 'flock.first_run.bigDate';
  31.  
  32.  
  33. const Cc = Components.classes;
  34. const Ci = Components.interfaces;
  35. const Cr = Components.results;
  36.  
  37.  
  38. gApp     = null;
  39. gConsole = null;
  40.  
  41.  
  42. function getObserverService() {
  43.   return Cc['@mozilla.org/observer-service;1']
  44.     .getService(Ci.nsIObserverService);
  45. }
  46.  
  47.  
  48. function RemoteConsoleLogger() {
  49.   gApp = Cc['@mozilla.org/xre/app-info;1']
  50.     .getService(Ci.nsIXULAppInfo)
  51.     .QueryInterface(Ci.nsIXULRuntime);
  52.   gConsole = Cc['@mozilla.org/consoleservice;1']
  53.     .getService(Ci.nsIConsoleService);
  54.  
  55.   this._registered = false;
  56.  
  57.   this._listener = {
  58.     logger: this,
  59.     observe: function CLL_observe(obj) { this.logger._log(obj) }
  60.   };
  61.  
  62.   var obs = getObserverService();
  63.  
  64.   obs.addObserver(this, 'profile-after-change', false);
  65.   obs.addObserver(this, 'xpcom-shutdown', false);
  66.  
  67.   if (ENABLED_BY_DEFAULT)
  68.     this.observe(null, 'nsPref:changed', null);
  69. }
  70.  
  71. RemoteConsoleLogger.prototype = {
  72.   _start: function CL__start() {
  73.     var prefs = Cc['@mozilla.org/preferences-service;1']
  74.       .getService(Ci.nsIPrefBranch2);
  75.  
  76.     prefs.addObserver(PREF_FLOCK_FIRST_RUN_DATE, this, false);
  77.     prefs.addObserver(PREF_FLOCK_LOG_ERRORS,     this, false);
  78.  
  79.     this.observe(null, 'nsPref:changed', null);
  80.   },
  81.   _configure: function CL__configure() {
  82.     var prefs = Cc['@mozilla.org/preferences-service;1']
  83.       .getService(Ci.nsIPrefBranch);
  84.  
  85.     var enabled;
  86.     try {
  87.       enabled = prefs.getBoolPref(PREF_FLOCK_LOG_ERRORS);
  88.     }
  89.     catch (e) {
  90.       /* disable by default always for dev builds */
  91.       if (gApp.appBuildID == '0000000000')
  92.         enabled = false;
  93.       else
  94.         enabled = ENABLED_BY_DEFAULT;
  95.     }
  96.  
  97.     var stamp;
  98.     try {
  99.       stamp = prefs.getCharPref(PREF_FLOCK_FIRST_RUN_DATE);
  100.     }
  101.     catch (e) {
  102.       stamp = '0';
  103.     }
  104.  
  105.     this._preamble = gApp.appBuildID + ' ' + stamp + '\n';
  106.  
  107.     if (enabled && !this._registered)
  108.       this._registerListener()
  109.     else if (!enabled && this._registered)
  110.       this._unregisterListener()
  111.   },
  112.   _shutdown: function CL__shutdown() {
  113.     gApp     = null;
  114.     gConsole = null;
  115.   },
  116.   _registerListener: function CL__registerListener() {
  117.     try {
  118.       gConsole.registerListener(this._listener);
  119.       this._registered = true;
  120.     }
  121.     catch (e) {
  122.       debug("Couldn't register with console service: " + e + "\n");
  123.     }
  124.   },
  125.   _unregisterListener: function CL__unregisterListener() {
  126.     try {
  127.       gConsole.unregisterListener(this._listener);
  128.       this._registered = false;
  129.     }
  130.     catch (e) {
  131.       debug("Couldn't unregister with console service: " + e + "\n");
  132.     }
  133.   },
  134.   _log: function CL__log(message) {
  135.     try {
  136.       var scriptError = message.QueryInterface(Ci.nsIScriptError);
  137.       if (scriptError.sourceName.indexOf('http:') != -1 ||
  138.           scriptError.sourceName.indexOf('https:') != -1)
  139.         return;
  140.  
  141.       var hr = Cc['@mozilla.org/xmlextras/xmlhttprequest;1']
  142.         .createInstance(Ci.nsIXMLHttpRequest);
  143.       hr.detachLoadGroup = true;
  144.       hr.open('POST', LOGGING_URL);
  145.       hr.send(this._preamble + scriptError.toString() + '\n');
  146.     }
  147.     catch (e) {
  148.       // Something bad happened, just ignore it
  149.     }
  150.   },
  151.  
  152.   observe: function CL_observe(subject, topic, state) {
  153.     var obs = getObserverService();
  154.  
  155.     switch (topic) {
  156.       case 'profile-after-change':
  157.         obs.removeObserver(this, 'profile-after-change');
  158.         this._start();
  159.         break;
  160.  
  161.       case 'xpcom-shutdown':
  162.         obs.removeObserver(this, 'xpcom-shutdown');
  163.         this._shutdown();
  164.         break;
  165.  
  166.       case 'nsPref:changed':
  167.         this._configure();
  168.         break;
  169.     }
  170.   },
  171.  
  172.   getInterfaces: function CL_getInterfaces(countRef) {
  173.     var interfaces = [Ci.nsIObserver, Ci.nsIClassInfo, Ci.nsISupports];
  174.     countRef.value = interfaces.length;
  175.     return interfaces;
  176.   },
  177.   getHelperForLanguage: function CL_getHelperForLanguage(language) {
  178.     return null;
  179.   },
  180.   contractID: CL_CONTRACTID,
  181.   classDescription: CL_CLASSNAME,
  182.   classID: CL_CLASSID,
  183.   implementationLanguage: Ci.nsIProgrammingLanguage.JAVASCRIPT,
  184.   flags: Ci.nsIClassInfo.SINGLETON,
  185.  
  186.   QueryInterface: function CL_QueryInterface(iid) {
  187.     if (iid.equals(Ci.nsIObserver) ||
  188.         iid.equals(Ci.nsIClassInfo) ||
  189.         iid.equals(Ci.nsISupports))
  190.       return this;
  191.     throw Cr.NS_ERROR_NO_INTERFACE;
  192.   }
  193. }
  194.  
  195.  
  196. function GenericComponentFactory(ctor) {
  197.   this._ctor = ctor;
  198. }
  199.  
  200. GenericComponentFactory.prototype = {
  201.  
  202.   _ctor: null,
  203.  
  204.   // nsIFactory
  205.   createInstance: function(outer, iid) {
  206.     if (outer != null)
  207.       throw Cr.NS_ERROR_NO_AGGREGATION;
  208.     return (new this._ctor()).QueryInterface(iid);
  209.   },
  210.  
  211.   // nsISupports
  212.   QueryInterface: function(iid) {
  213.     if (iid.equals(Ci.nsIFactory) ||
  214.         iid.equals(Ci.nsISupports))
  215.       return this;
  216.     throw Cr.NS_ERROR_NO_INTERFACE;
  217.   },
  218. };
  219.  
  220. var Module = {
  221.   QueryInterface: function(iid) {
  222.     if (iid.equals(Ci.nsIModule) ||
  223.         iid.equals(Ci.nsISupports))
  224.       return this;
  225.  
  226.     throw Cr.NS_ERROR_NO_INTERFACE;
  227.   },
  228.  
  229.   getClassObject: function(cm, cid, iid) {
  230.     if (!iid.equals(Ci.nsIFactory))
  231.       throw Cr.NS_ERROR_NOT_IMPLEMENTED;
  232.  
  233.     if (cid.equals(CL_CLASSID))
  234.       return new GenericComponentFactory(RemoteConsoleLogger)
  235.  
  236.     throw Cr.NS_ERROR_NO_INTERFACE;
  237.   },
  238.  
  239.   registerSelf: function(cm, file, location, type) {
  240.     var cr = cm.QueryInterface(Ci.nsIComponentRegistrar);
  241.     cr.registerFactoryLocation(CL_CLASSID, CL_CLASSNAME, CL_CONTRACTID,
  242.                                file, location, type);
  243.  
  244.     var catman = Cc['@mozilla.org/categorymanager;1']
  245.       .getService(Ci.nsICategoryManager);
  246.     catman.addCategoryEntry('app-startup', CL_CLASSNAME,
  247.                             'service,' + CL_CONTRACTID,
  248.                             true, true);
  249.   },
  250.  
  251.   unregisterSelf: function(cm, location, type) {
  252.     var cr = cm.QueryInterface(Ci.nsIComponentRegistrar);
  253.     cr.unregisterFactoryLocation(CL_CLASSID, location);
  254.   },
  255.  
  256.   canUnload: function(cm) {
  257.     return true;
  258.   },
  259. };
  260.  
  261. function NSGetModule(compMgr, fileSpec)
  262. {
  263.   return Module;
  264. }
  265.